package com.bytecodes.eaulas.comun.servicios;

import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import com.bytecodes.eaulas.comun.excepciones.EAulasDriverExcepcion;
import com.bytecodes.eaulas.comun.excepciones.EAulasGenericExcepcion;
import com.bytecodes.eaulas.comun.excepciones.EAulasSQLExcepcion;
/**
 * Clase que gestiona la conexion a la base de datos.
 * @author David Fern�ndez
 */
public class GestorDiscoConexion {

	/**
	 * Variable que contiene la conexi�n a la bbdd
	 */
	protected Connection conexion = null;

	/**
	 * M�todo que crea la conexion a la BD indicada en el fichero de propiedades
	 * @exception EAulasGenericExcepcion
	 */
	public void conectarBD() throws EAulasGenericExcepcion {
		String url = "";
		String usuario = "";
		String clave ="";
		try {
			Class.forName("org.postgresql.Driver");
			Properties prop = new Properties();
			final String propertiesFile = new File("").getAbsolutePath() + "/src/com/bytecodes/eaulas/resources/configuration.properties";
			prop.load(new FileInputStream(propertiesFile));
			url = prop.getProperty("url");
			usuario = prop.getProperty("username");
			clave = prop.getProperty("password");
			conexion = DriverManager.getConnection(url, usuario, clave);
		}catch (ClassNotFoundException e) {
			throw new EAulasDriverExcepcion(e);
		} 
		catch (Exception e) {
			throw new EAulasDriverExcepcion(e);
		}
	}

	/** M�todo sin par�metros que crea una sentencia para manipular la base de datos.
	 * @return Statement - la sentencia creada.
	 * @exception EAulasGenericExcepcion
	 */
	public Statement crearSentencia() throws EAulasGenericExcepcion {
		Statement sentencia = null;
		try {
			sentencia = conexion.createStatement();
		} catch (SQLException sqle) {
			throw new EAulasSQLExcepcion(sqle);
		} catch (Exception e) {
			System.out.println(e.getMessage());
			// lanzar una excepcion propia
		}
		return sentencia;
	}

	/** M�todo que crea un Prepared Statement para manipular la base de datos.<br>
	 * @return PreparedStatement - la sentencia creada.
	 * @exception ESecretariaException
	 */
	public PreparedStatement crearPreparedStatement(String ps) throws EAulasGenericExcepcion {
		try {
			return conexion.prepareStatement(ps, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
		} catch (SQLException sqle) {
			throw new EAulasSQLExcepcion(sqle);
		} catch (Exception e) {
			System.out.println(e.getMessage());
			//lanzar excepcion propia
		}
		return null;
	}

	/** M�todo sin par�metros que provoca la desconexion a la base de datos.
	 * @exception EAulasGenericExcepcion
	 */
	public void cerrarConexionBD() throws EAulasGenericExcepcion {
		try {
			conexion.close(); 
		} catch (SQLException sqle) {
			throw new EAulasSQLExcepcion(sqle);
		} catch (Exception e) {
			System.out.println(e.getMessage());
			//lanzar excepcion propia
		}
	}

	/** M�todo sin par�metros que obtiene la conexion actual a la base de datos.
	 * @return Connection - la conexion a la base de datos.
	 * @exception EAulasGenericExcepcion
	 */
	public Connection getConexion() {
		return conexion;
	}

	/** M�todo que asigna la conexion actual a la base de datos.
	 * @exception EAulasGenericExcepcion
	 */
	public void setConexion(Connection pConexion) {
		conexion = pConexion;
	}
}
